//
//  Modelo.h
//  PEI
//
//  Created by asc on 10/03/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#ifndef PEI_Modelo_h
#define PEI_Modelo_h

#include <iostream>
#include <fstream>
#include <string>
#include <exception>
#include <stdexcept>
#include <cstdlib>
#include <ctime>
#include <list>
#include <vector>
#include <iterator>
#include <algorithm>
#include <stddef.h>

using namespace std;

class Vista;
using namespace std;

/*!
 * \class Modelo
 * \brief Es la clase base de los modelos en este ejemplo.
 */
class Modelo
{
    friend class Vista;
    // Parte publica
public:
    
    //! Constructor por defecto
    Modelo();
    //! Constructor de copia
    Modelo(const Modelo& un_modelo);
    
    //! Destructor
    ~Modelo();
    
    //! Asignacion
    Modelo & operator =(const Modelo& un_modelo);
    
    /*!
     * \brief Actualiza las vistas sobre este modelo.
     *
     * Excepto la que se pasa como parametro, por defecto el par·metro es
     * NULL y en ese caso se actualizan todas.
     *
     * Es ˙til cuando una vista actualiza el modelo y solicita a este
     * que actualice todas sus vistas asociadas, en este caso puede
     * indicar que actualice a todas menos a ella que ya muestra el
     * estado en el que quedara el modelo.
     */
    void actualizar_vistas(Vista* v = NULL);
    
    
    // Parte protegida
protected:
    //! La lista de vistas asociadas con este modelo.
    list<Vista*> lv;
    
    /*! 
     * \brief AÒade una nueva vista para este modelo.
     *
     * \param v La vista a aÒadir al modelo.
     */
    void anyadir_vista(Vista* v) { lv.push_back(v); }
    
    // Parte privada
private:
    
};




#endif
